//
// Created by denglibin on 19-5-7.
//

#ifndef OPENGL_SHADER_H
#define OPENGL_SHADER_H
#ifdef  __cplusplus
extern "C"
    {
#endif

#include "glad/glad.h"
/**
 * 着色器相关函数
 */
//着色器程序 结构体
typedef struct shader_program {
    unsigned int id;//着色器程序id
    GLchar *vertexFilePath; //顶点着色器代码文件路径
    GLchar *fragmentFilePath; //片段着色器代码文件路径
} ShaderProgram;

//着色器类型
typedef enum shader_type {
    VERTEX, //顶点着色器
    FRAGMENT //片段着色器
} ShaderType;

/**
 * 创建着色器程序
 * @param shader
 */
void createShaderProgram(ShaderProgram *shader);

/**
 * 设置uniform 变量的值 bool类型
 * @param shaderProgramId  着色器程序id
 * @param name  变量名
 * @param value  值
 */
void setBool(unsigned int shaderProgramId, GLchar *name, GLboolean value);

/**
 * 设置uniform 变量的值 int类型
 * @param shaderProgramId  着色器程序id
 * @param name  变量名
 * @param value  值
 */
void setInt(unsigned int shaderProgramId, GLchar *name, GLint value);

/**
 * 设置uniform 变量的值 float类型
 * @param shaderProgramId  着色器程序id
 * @param name  变量名
 * @param value  值
 */
void setFloat(unsigned int shaderProgramId, GLchar *name, GLfloat value);

/**
 * 设置uniform 变量的值 4个 float类型
 * @param shaderProgramId
 * @param name
 * @param value1
 * @param value2
 * @param value3
 * @param value4
 */
void set4Float(unsigned int shaderProgramId, GLchar *name, GLfloat value1, GLfloat value2, GLfloat value3, GLfloat value4);
/**
 *
 * @param shaderProgramId
 * @param name
 * @param value1
 * @param value2
 * @param value3
 */
void setVec3(unsigned int shaderProgramId, GLchar *name, GLfloat value1, GLfloat value2, GLfloat value3);

/**
 *
 * 读取文件内容到缓冲区
 * @param srcFilePath
 * @return 返回缓冲区指针 失败返回NULL
 */
char *readFile(char *srcFilePath);

/**
 * 创建着色器
 * @param shaderType 着色器类型
 * @param shaderSrc 着色器代码
 * @return 返回着色器id 失败返回-1
 */
int createShader(ShaderType shaderType, char *shaderSrc);

/**
 * 获取文件大小
 * @param filePath
 * @return
 */
int getFileSize(char *filePath);

#ifdef  __cplusplus
}
#endif
#endif //OPENGL_SHADER_H